package IHM;

import java.util.ArrayList;

import Client.Reservation;
import Serveur.Serveur;
import Services.ManageServices;
import Services.Repas;
import Services.ServiceChoisis;
import Services.TypeServices;
import Services.typeBillet;
import Passager.Passager;
import Passager.Profil;
import Services.TypeClasseTransport;
import Transports.TypeTransport;
import Carte.Trajet;

/**
 * Affiche une interface client sous forme de console
 * 
 * @author Adrian GUARRERA
 *
 */
public class ConsoleClient {	
	private Serveur serveur;
	private int numClient;
	
	/**
	 * Constructeur de l'IHM en mode console
	 * @param serveur
	 */
    public ConsoleClient(Serveur serveur) {
    	this.serveur = serveur;
	}
    
    /**
     * Affiche la partie IHM console du client
     */
    public void clientConsole(){
		System.out.println("->Mode client:");
    	boolean clientExistant = ScannerUtiles.ouiOuNon("Etes-vous deja client?");
    	if(clientExistant){
        	numClient = ScannerUtiles.acquerirInfoInteger("Quel est votre numero client?");
        	while(serveur.getPassagerListe(numClient) == null){
        		numClient = ScannerUtiles.acquerirInfoInteger("Veuillez resaisir votre numero client?");
        	}
    	}
    	else{
    		numClient = creerPassager();
    	}
    	
		menuReservation(numClient);
    }
    
    /**
     * Permet de choisir entre creer une reservation ou consulter ses reservations
     */
    public void menuReservation(int numClient){
    	Passager clientCourant = serveur.getPassagerListe(numClient);
    	System.out.println("- - - - - - -");
    	System.out.println(clientCourant.toString());
    	System.out.println("- - - - - - -");
    	
    	int choix = ScannerUtiles.acquerirInfoInteger("Quelle action voulez vous effectuer?:\n" +
        		"1 -> creer une reservation\n" +
        		"2 -> consulter une reservation\n" +
				"0 -> retour menu");
        if(choix == 1){
        	creerReservation(numClient);
        }else if(choix == 2){ 
        	consulterReservations(numClient);
        }	
    }
    
    /**
     * Permet de creer une reservation
     */
    public void creerReservation(int numClient){
        Trajet trajetChoisi = choisirTrajet();
        int idTrajetChoisi = serveur.getIndexOfTrajet(trajetChoisi);
        
        ArrayList<Integer> ListePassager = new ArrayList<Integer>();
        ArrayList<ServiceChoisis> ListeServiceChoisi = new ArrayList<ServiceChoisis>();
        ListePassager.add(numClient);
    	ListeServiceChoisi.add(choixServices(trajetChoisi));   
    	
    	Reservation nouvelleReservation = new Reservation(serveur, idTrajetChoisi, ListePassager, ListeServiceChoisi);
    	
    	boolean modifier = false;
    	do{
        	modifier = ScannerUtiles.ouiOuNon("Voulez-vous ajouter un passager a cette reservation?");
        	if(modifier){        		
        		if(!nouvelleReservation.addPassager(serveur.getPassagerListe(choisirPassager()), choixServices(nouvelleReservation.getTrajet()))){
        			System.out.println("Ce passager est deja dans la reservation!");
        		}
        	}
    	}while(modifier);    	
    	
        System.out.println(nouvelleReservation.toString());
        boolean validation = ScannerUtiles.ouiOuNon("Validez-vous cette reservation?");
        if(validation){
        	if(nouvelleReservation.reserver()){    
        		System.out.println("Reservation ajoutee\n");	
        	}else{
        		System.out.println("Erreur, reservation annulee");
        	}
        }
    	else{
    		System.out.println("Reservation annulee\n");	
    	}	
    }

    /**
     * Permet de choisir un trajet
     * @return le trajet choisi
     */
    public Trajet choisirTrajet(){
    	Trajet trajetChoisi = null;
        ArrayList<Trajet> trajetsRecherches = serveur.getListeTrajet();
        int entierafficher=0;
        for (Trajet trajetR : trajetsRecherches) {
            System.out.println("Trajet n " + entierafficher + " : " + trajetR);
            entierafficher++;
        }  
        int nbTrajet = 0;
        do{        	
        	nbTrajet = ScannerUtiles.acquerirInfoInteger("Trajet choisi?");
        }while(nbTrajet >= entierafficher || nbTrajet < 0);
        
        trajetChoisi = serveur.getTrajetListe(nbTrajet);
    	return trajetChoisi;
    }    
    
    /**
     * Permet de creer un passager
     * @return le numero client du passager nouvellement cree
     */
    public int creerPassager(){
    	String nom = ScannerUtiles.acquerirInfo("Nom?");
    	String prenom = ScannerUtiles.acquerirInfo("Prenom?");
    	int idNouveauPassager = serveur.addPassager(nom, prenom);
    	System.out.println("Le numero client associe est : " + idNouveauPassager);
    	return idNouveauPassager;
    }
    
    public int choisirPassager(){
    	boolean clientExistant = ScannerUtiles.ouiOuNon("Le passager est-il deja client?");
    	int idPassager;
    	if(clientExistant){
    		idPassager = ScannerUtiles.acquerirInfoInteger("Quel est son numero client?"); serveur.getPassagerListe(idPassager);
        	System.out.println("- - - - - - -");
        	System.out.println(serveur.getPassagerListe(idPassager).toString());
        	System.out.println("- - - - - - - ");   	
    	}
    	else{
    		idPassager = creerPassager();
    	}    
    	return idPassager;
    }
    
    /**
     * Permet de selectionner des services
     * @return Une liste de services dans un objet ServiceChoisis
     */
    public ServiceChoisis choixServices(Trajet trajet){
    	System.out.println("Caracteristiques du voyage :");  
    	TypeTransport type = serveur.getTransportListe(trajet.getIdTransport()).getTypeDuTransport();
    	ArrayList<TypeServices> typeServicesTransport = ManageServices.ServiceTransport(type);
    	Profil profil = null;
    	TypeClasseTransport classe = null;
    	ArrayList<Repas> repas = null;
    	typeBillet typeBillet = null;
    	
    	for(TypeServices typeService : typeServicesTransport){
    		switch(typeService){
    		case NBREPAS:
    			repas = choixRepas();
    			break;
    		case CLASSETRANSPORT:
    			classe = choixClasseTransport();
    			break;
    		case PROFIL :
    			profil = choixProfil();
    			break;
    		case BILLET:
    			typeBillet = choixBillet();
    			break;
    		case NBNUIT:
    			choixNuits(trajet);
    			break;
    		}
    	}
    	return new ServiceChoisis(classe,profil,repas,typeBillet,0);
    }  
    
    /**
     * Permet de choisir sa classe
     * @return La classe choisi
     */
    public TypeClasseTransport choixClasseTransport(){
    	TypeClasseTransport.showAll();
    	int nbClasse = ScannerUtiles.acquerirInfoInteger("Classe choisie?");
    	return TypeClasseTransport.choixTypeClasseTransport(nbClasse);
    }
    
    /**
     * Permet de choisir un profil
     * @return Un profil de client
     */
    public Profil choixProfil(){
    	Profil.showAll();
    	int nbProfil = ScannerUtiles.acquerirInfoInteger("Type de voyageur?");
    	return Profil.choixProfil(nbProfil);
    }
    
    /**
     * Permet de choisir une liste de repas
     * @return La liste des repas choisis
     */
    public ArrayList<Repas> choixRepas(){
    	int nbRepasAManger = ScannerUtiles.acquerirInfoInteger("Combien voulez-vous de repas?");
    	if(nbRepasAManger>0) Repas.showAll();
    	ArrayList<Repas> choixRepas = new ArrayList<Repas>();
    	for(int i=1; i <= nbRepasAManger ; i++){
	    	int nbRepas = ScannerUtiles.acquerirInfoInteger("Repas choisi?");
	    	choixRepas.add(Repas.choixRepas(nbRepas));    		
    	}
    	return choixRepas;
    }

    /**
     * Permet de choisir le type de billet
     * @return Un type de billet
     */
    public typeBillet choixBillet(){
    	typeBillet.showAll();
    	int nbTypeBillet = ScannerUtiles.acquerirInfoInteger("Type de billet?");
    	return typeBillet.choixtypeBillet(nbTypeBillet);
    }
    
    /**
     * Permet de choisir le nombre de nuits
     * @return Un type de billet
     */
    public int choixNuits(Trajet trajetChoisi){
    	int tempsTrajet = trajetChoisi.getTime()/(24*60);
    	int nbNuits = 0;
    	do{
    		nbNuits = ScannerUtiles.acquerirInfoInteger("Combien de nuits voulez-vous reserver?");
    	}while(nbNuits > tempsTrajet && nbNuits < 0);
    	
    	return nbNuits;
    }
    
    /**
     * Permet a un client de consulter ses reservations
     */
    public void consulterReservations(int numClient){
    	ArrayList<Reservation> reservationsClient = serveur.getPassagerReservation(serveur.getPassagerListe(numClient));
    	
    	int entierafficher = 1;
        for (Reservation reservation : reservationsClient) {
            System.out.println("Resa n " + entierafficher + " : " + reservation);
            entierafficher++;
        }
    }
}
